<?php

// +----------------------------------------------------------------------
// | 公共函数库
// +----------------------------------------------------------------------

/*
  URL组装 支持不同模式和路由
  字符串传参 U（'[项目://][路由@][分组名-模块/]操作? 参数1=值1[&参数N=值N]'）
  数组传参 U（'[项目://][路由@][分组名-模块/]操作',array('参数1'=>'值1' [,'参数N'=>'值N'])）
  如果不定义项目和模块的话 就表示当前项目和模块名称 例如：
  U（'Myapp://User/add'） // 生成Myapp项目的User模块的add操作的URL地址
  U（'Blog/read?id=1'） // 生成Blog模块的read操作 并且id为1的URL地址
  U（'Admin-User/select'） // 生成Admin分组的User模块的select操作的URL地址
  U（'Test@Admin?id=1'）
 */
function U($url, $params=array(), $url_mode='', $redirect=false) {
	if (0 === strpos($url, '/'))
		$url = substr($url, 1);
	if (!strpos($url, '://')) // 没有指定项目名 使用当前项目名
		$url = 'fee://' . $url;

	// 分析URL地址
	$array = parse_url($url);
	$router = ('fee' == $array['scheme']) ? '' : $array['scheme'];
	$group = GROUP_NAME;
	if (isset($array['path'])) {
		//指定了模块和操作
		$action = substr($array['path'], 1);
		if (strpos($array['host'], '-')) {
			list($group, $module) = explode('-', $array['host']);
		} else {
			$module = $array['host'];
		}
	} else {
		//只指定操作
		$module = MODULE_NAME;
		$action = $array['host'];
	}
	if (isset($array['query'])) {
		parse_str($array['query'], $query);
		$params = array_merge($query, $params);
	}

	//开始处理url组合
	$default_group = C('DEFAULT_GROUP');
	$default_module = C('DEFAULT_MODULE');
	$default_action = C('DEFAULT_ACTION');
	if (!is_numeric($url_mode))
		$url_mode = C('URL_MODEL');
	if ($url_mode > 0) {
		$depr = C('URL_PATHINFO_DEPR');
		$str = '';
		foreach ($params as $var => $val) {
			$str .= $var . $depr . $val . $depr;
		}
		//组合url
		$group_depr = ($group != DEFAULT_GROUP) ? $group . $depr : '';
		$module_depr = ($module == $default_module && $action == $default_action && empty($params)) ? '' : $module . $depr;
		$action_depr = ($action == $default_action && empty($params)) ? '' : $action . $depr;
		$url = '/' . $group_depr . $module_depr . $action_depr . $str;
		$url = rtrim($url, $depr);
		if (C('URL_HTML_SUFFIX') && ($group != DEFAULT_GROUP || $module != $default_module || $action != $default_action || !empty($params))) {
			$url .= C('URL_HTML_SUFFIX');
		} else {
			$url .='/';
		}
		//url路径模式处理
		if ($url_mode == URL_REWRITE) {
			$phpfile = dirname(_PHP_FILE_);
			if ($phpfile == '/' || $phpfile == '\\')
				$phpfile = '';
		}else {
			$phpfile = _PHP_FILE_;
		}
		$url = $phpfile . $url;
	} else {
		$params = http_build_query($params);
		$group_depr = ($group != DEFAULT_GROUP) ? C('VAR_GROUP') . '=' . $group . '&' : '';
		$module_depr = ($module == $default_module && $action == $default_action && empty($params)) ? '' : C('VAR_MODULE') . '=' . $module . '&';
		$action_depr = ($action == $default_action && empty($params)) ? '' : C('VAR_ACTION') . '=' . $action . '&';
		$url = '?' . $group_depr . $module_depr . $action_depr . $params;
		$url = rtrim($url, '&');
		$url = _PHP_FILE_ . $url;
	}
	if (C('URL_SUB_DOMAIN_ON'))
		$url = get_host() . $url;

	if ($redirect)
		redirect($url);
	else
		return $url;
}

// 得到当前网站域名信息
function get_host() {
	$host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME'] ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
	$port = $_SERVER['SERVER_PORT']=='80' ? '' : $_SERVER['SERVER_PORT'];
	return 'http://' . $host . $port;
}

// 获取客户端IP地址
function get_ip() {
	if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
		$ip = getenv("HTTP_CLIENT_IP");
	else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
		$ip = getenv("HTTP_X_FORWARDED_FOR");
	else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
		$ip = getenv("REMOTE_ADDR");
	else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
		$ip = $_SERVER['REMOTE_ADDR'];
	else
		$ip = "unknown";
	return($ip);
}

// 错误输出
function halt($error) {
	$e = array();
	if (C('APP_DEBUG')) {
		//调试模式下输出错误信息
		if (!is_array($error)) {
			$trace = debug_backtrace();
			array_shift($trace);
			$e['message'] = $error;
			$e['file'] = $trace[0]['file'];
			$e['class'] = $trace[0]['class'];
			$e['function'] = $trace[0]['function'];
			$e['line'] = $trace[0]['line'];
			$traceInfo = '';
			$time = date("y-m-d H:i:m");
			foreach ($trace as $t) {
				$traceInfo .= '[' . $time . '] ' . $t['file'] . ' (' . $t['line'] . ') ';
				$traceInfo .= $t['class'] . $t['type'] . $t['function'] . '(';
				$traceInfo .= implode(', ', $t['args']);
				$traceInfo .=")<br/>";
			}
			$e['trace'] = $traceInfo;
		} else {
			$e = $error;
		}
		// 包含异常页面模板
		include C('TPL_EXCEPTION_FILE');
	} else {
		//否则定向到错误页面
		$error_page = C('ERROR_PAGE');
		if (!empty($error_page)) {
			redirect($error_page);
		} else {
			if (C('SHOW_ERROR_MSG'))
				$e['message'] = is_array($error) ? $error['message'] : $error;
			else
				$e['message'] = C('ERROR_MESSAGE');
			// 包含异常页面模板
			include C('TPL_EXCEPTION_FILE');
		}
	}
	exit;
}

// URL重定向
function redirect($url, $time=0, $msg='') {
	//多行URL地址支持
	$url = str_replace(array("\n", "\r"), '', $url);
	if (empty($msg))
		$msg = "系统将在{$time}秒之后自动跳转到{$url}！";
	if (!headers_sent()) {
		// redirect
		if (0 === $time) {
			header("Location: " . $url);
		} else {
			header("refresh:{$time};url={$url}");
			echo($msg);
		}
		exit();
	} else {
		$str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
		if ($time != 0)
			$str .= $msg;
		exit($str);
	}
}

// 自定义异常处理
function throw_exception($msg, $type='fee_exception', $code=0) {
	if (class_exists($type, false))
		throw new $type($msg, $code, true);
	else
		halt($msg);  //异常类型不存在则输出错误信息字串
}

// 浏览器变量调试输出
function dump($var, $echo=true, $label=null, $strict=true) {
	$label = ($label === null) ? '' : rtrim($label) . ' ';
	if (!$strict) {
		if (ini_get('html_errors')) {
			$output = print_r($var, true);
			$output = "<pre>" . $label . htmlspecialchars($output, ENT_QUOTES) . "</pre>";
		} else {
			$output = $label . " : " . print_r($var, true);
		}
	} else {
		ob_start();
		var_dump($var);
		$output = ob_get_clean();
		if (!extension_loaded('xdebug')) {
			$output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output);
			$output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
		}
	}
	if ($echo) {
		echo($output);
		return null;
	}else
		return $output;
}

// 取得对象实例 支持调用类的静态方法
function get_instance_of($name, $method='', $args=array()) {
	static $_instance = array();
	$identify = empty($args) ? $name . $method : $name . $method . md5(serialize($args));
	if (!isset($_instance[$identify])) {
		if (class_exists($name)) {
			$o = new $name();
			if (method_exists($o, $method)) {
				if (!empty($args)) {
					$_instance[$identify] = call_user_func_array(array(&$o, $method), $args);
				} else {
					$_instance[$identify] = $o->$method();
				}
			}
			else
				$_instance[$identify] = $o;
		}
		else
			halt(L('_CLASS_NOT_EXIST_') . ':' . $name);
	}
	return $_instance[$identify];
}

//系统自动加载基类库和当前项目的model和action对象  并且支持配置自动加载路径
function __autoload($name) {
	// 检查是否存在别名定义
	if (alias_import($name))
		return;
	// 自动加载当前项目的action类和model类
	if (substr($name, -5) == "model") {
		require_cache(APP_PATH . '/' . GROUP_NAME . '/model/' . $name . '.class.php');
	} elseif (substr($name, -6) == "action") {
		require_cache(APP_PATH . '/' . GROUP_NAME . '/action/' . $name . '.class.php');
	} else {

	}
	return;
}

// 优化的require_once
function require_cache($filename) {
	static $_importFiles = array();
	$filename = realpath($filename);
	if (!isset($_importFiles[$filename])) {
		if (file_exists($filename)) {
			require $filename;
			$_importFiles[$filename] = true;
		} else {
			$_importFiles[$filename] = false;
		}
	}
	return $_importFiles[$filename];
}

/**
 * 加载函数
 * @param string $name 函数库文件名 不带后缀
 * @param string $app 分组名称
 * @param string $ext 导入的文件扩展名
 */
function load_fun($name, $app='', $ext='.fun.php') {
	$baseUrl = empty($app) ? LIB_PATH . '/function' : APP_PATH . '/' . $app . '/function';
	$name = trim($name, '/');
	return require_cache($baseUrl . '/' . $name . $ext);
}

/**
 * 加载classes类库
 * @param string $name 类库文件名 不带后缀
 * @param string $app 分组名称
 * @param string $obj 是否实例化类
 * @param string $ext 导入的文件扩展名
 */
function load_class($name, $app='', $obj=false, $ext='.class.php') {
	$baseUrl = empty($app) ? LIB_PATH . '/classes' : APP_PATH . '/' . $app . '/classes';
	$name = trim($name, '/');
	$res = require_cache($baseUrl . '/' . $name . $ext);
	$name = explode('/', $name);
	$name = array_pop($name);
	return $res ? ($obj ? get_instance_of($name) : true) : false;
}

/**
 * 加载classes类库
 * @param string $name 类库文件名 不带后缀
 * @param string $app 分组名称
 * @param string $obj 是否实例化类
 * @param string $ext 导入的文件扩展名
 */
function load_plugin($name, $app = '', $obj=false, $ext='.class.php') {
	$baseUrl = empty($app) ? LIB_PATH . '/plugin' : APP_PATH . '/' . $app . '/plugin';
	$name = trim($name, '/');
	$res = require_cache($baseUrl . '/' . $name . $ext);
	$name = explode('/', $name);
	$name = array_pop($name);
	return $res ? ($obj ? get_instance_of($name) : true) : false;
}

// 快速定义和导入别名
function alias_import($alias, $classfile='') {
	static $_alias = array();
	if ('' !== $classfile) {
		// 定义别名导入
		$_alias[$alias] = $classfile;
		return;
	}
	if (is_string($alias)) {
		if (isset($_alias[$alias]))
			return require_cache($_alias[$alias]);
	}elseif (is_array($alias)) {
		foreach ($alias as $key => $val)
			$_alias[$key] = $val;
		return;
	}
	return false;
}

/**
 * 加载控制器
 * @param string name Action名称
 * @param string app Action所在分组
 * @param bool obj Action所在分组
 * @return action object
 */
function A($name, $app='', $obj=true) {
	static $_action = array();
	if (empty($app))
		$app = GROUP_NAME;
	$key = md5(strtolower($app . $name));
	if (isset($_action[$key]))
		return $_action[$key];
	//加载action
	$className = $name . '_action';
	$path = APP_PATH . '/' . $app . '/action';
	$res = require_cache($path . '/' . $className . '.class.php');
	if ($res) {
		if ($obj && class_exists($className, false)) {
			$action = new $className();
			$_action[$key] = $action;
			return $action;
		} else {
			return true;
		}
	} else {
		return false;
	}
}

/**
 * 加载模型
 * @param string name Model名称
 * @param string app Model所在分组
 * @return model object
 */
function M($name='', $app='') {
	if (empty($name))
		return get_instance_of('model');

	static $_model = array();
	if ($app == '')
		$app = GROUP_NAME;
	$key = md5(strtolower($app . $name));
	if (isset($_model[$key]))
		return $_model[$key];

	$className = $name . '_model';
	$path = APP_PATH . '/' . $app . '/model';
	require_cache($path . '/' . $className . '.class.php');
	if (class_exists($className)) {
		$model = new $className();
	} else {
		$model = new model($name);
	}
	$_model[$key] = $model;
	return $model;
}

// 获取和设置语言定义(不区分大小写)
function L($name=null, $value=null) {
	static $_lang = array();
	// 空参数返回所有定义
	if (empty($name))
		return $_lang;
	// 判断语言获取(或设置)
	// 若不存在,直接返回全大写$name
	if (is_string($name)) {
		$name = strtoupper($name);
		if (is_null($value))
			return isset($_lang[$name]) ? $_lang[$name] : $name;
		$_lang[$name] = $value; // 语言定义
		return;
	}
	// 批量定义
	if (is_array($name))
		$_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER));
	return;
}

// 执行行为
function B($name) {
	$class = $name . '_behavior';
	$behavior = load_class('behavior/' . $class, '', true);
	return $behavior->run();
}

// 全局缓存设置和读取
function S($name, $value='', $expire='', $type='') {
	static $_cache = array();
	alias_import('cache');
	//取得缓存对象实例
	$cache = cache::getInstance($type);
	if ('' !== $value) {
		if (is_null($value)) {
			// 删除缓存
			$result = $cache->rm($name);
			if ($result)
				unset($_cache[$type . '_' . $name]);
			return $result;
		}else {
			// 缓存数据
			$cache->set($name, $value, $expire);
			$_cache[$type . '_' . $name] = $value;
		}
		return;
	}
	if (isset($_cache[$type . '_' . $name]))
		return $_cache[$type . '_' . $name];
	// 获取缓存数据
	$value = $cache->get($name);
	$_cache[$type . '_' . $name] = $value;
	return $value;
}

// 快速文件数据读取和保存 针对简单类型数据 字符串、数组
function F($name, $value='', $path=CACHE_PATH) {
	static $_cache = array();
	$name = ltrim($name, '/');
	$filename = $path . '/' . $name . '.php';
	if ('' !== $value) {
		if (is_null($value)) {
			// 删除缓存
			return unlink($filename);
		} else {
			// 缓存数据
			$dir = dirname($filename);
			// 目录不存在则创建
			if (!is_dir($dir))
				mkdir($dir);
			$_cache[$name] = $value;
			return file_put_contents($filename, "<?php\nreturn " . var_export($value, true) . ";\n?>");
		}
	}
	if (isset($_cache[$name]))
		return $_cache[$name];
	// 获取缓存数据
	if (is_file($filename)) {
		$value = include $filename;
		$_cache[$name] = $value;
	} else {
		$value = false;
	}
	return $value;
}

// 循环创建目录
function mk_dir($dir, $mode = 0755) {
	if (is_dir($dir) || @mkdir($dir, $mode))
		return true;
	if (!mk_dir(dirname($dir), $mode))
		return false;
	return @mkdir($dir, $mode);
}

// 写入文件
function write_file($l1, $l2='0777') {
	$dir = dirname($l1);
	if (!is_dir($dir))
		mk_dir($dir);
	return file_put_contents($l1, $l2);
}

/**
  +----------------------------------------------------------
 * Cookie 设置、获取、清除
  +----------------------------------------------------------
 * 1 获取cookie: cookie('name')
 * 2 清空当前设置前缀的所有cookie: cookie(null)
 * 3 删除指定前缀所有cookie: cookie(null,'think_') | 注：前缀将不区分大小写
 * 4 设置cookie: cookie('name','value') | 指定保存时间: cookie('name','value',3600)
 * 5 删除cookie: cookie('name',null)
  +----------------------------------------------------------
 * $option 可用设置prefix,expire,path,domain
 * 支持数组形式对参数设置:cookie('name','value',array('expire'=>1,'prefix'=>'think_'))
 * 支持query形式字符串对参数设置:cookie('name','value','prefix=tp_&expire=10000')
 */
function cookie($name, $value='', $option=null) {
	// 默认设置
	$config = array(
		'prefix' => C('COOKIE_PREFIX'), // cookie 名称前缀
		'expire' => C('COOKIE_EXPIRE'), // cookie 保存时间
		'path' => C('COOKIE_PATH'), // cookie 保存路径
		'domain' => C('COOKIE_DOMAIN'), // cookie 有效域名
	);
	// 参数设置(会覆盖黙认设置)
	if (!empty($option)) {
		if (is_numeric($option))
			$option = array('expire' => $option);
		elseif (is_string($option))
			parse_str($option, $option);
		$config = array_merge($config, array_change_key_case($option));
	}
	// 清除指定前缀的所有cookie
	if (is_null($name)) {
		if (empty($_COOKIE))
			return;
		// 要删除的cookie前缀，不指定则删除config设置的指定前缀
		$prefix = empty($value) ? $config['prefix'] : $value;
		if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回
			foreach ($_COOKIE as $key => $val) {
				if (0 === stripos($key, $prefix)) {
					setcookie($key, '', time() - 3600, $config['path'], $config['domain']);
					unset($_COOKIE[$key]);
				}
			}
		}
		return;
	}
	$name = $config['prefix'] . $name;
	if ('' === $value) {
		return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null; // 获取指定Cookie
	} else {
		if (is_null($value)) {
			setcookie($name, '', time() - 3600, $config['path'], $config['domain']);
			unset($_COOKIE[$name]); // 删除指定cookie
		} else {
			// 设置cookie
			$expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;
			setcookie($name, $value, $expire, $config['path'], $config['domain']);
			$_COOKIE[$name] = $value;
		}
	}
}

// 清除转义字符
function stripslashes_deep($value) {
	$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
	return $value;
}

// 添加转义字符
function addslashes_deep($str) {
	$str = is_array($str) ? array_map('addslashes_deep', $str) : addslashes($str);
	return $str;
}

// 字符转换成JS格式
function t2js($l1, $l2=1) {
	$I1 = str_replace(array("\r", "\n"), array('', '\n'), addslashes($l1));
	return $l2 ? "document.write(\"$I1\");" : $I1;
}

//中文截取，单字节截取模式
function cnsubstr($str, $slen, $startdd=0, $suffix=false) {
	$from = C('DEFAULT_CHARSET');
	if ($from == 'utf-8')
		$str = auto_charset($str, 'utf-8', 'gbk');
	$restr = "";
	$c = "";
	$str_len = strlen($str);
	if ($str_len < $startdd + 1)
		return "";
	if ($str_len < $startdd + $slen || $slen == 0)
		$slen = $str_len - $startdd;
	$enddd = $startdd + $slen - 1;
	for ($i = 0; $i < $str_len; $i++) {
		if ($startdd == 0)
			$restr .= $c;
		else if ($i > $startdd)
			$restr .= $c;
		if (ord($str[$i]) > 127) {
			if ($str_len > $i + 1)
				$c = $str[$i] . $str[$i + 1];
			$i++;
		}
		else {
			$c = $str[$i];
		}
		if ($i >= $enddd) {
			if (strlen($restr) + strlen($c) > $slen)
				break;
			else {
				$restr .= $c;
				break;
			}
		}
	}
	if ($from == 'utf-8')
		$restr = auto_charset($restr, 'gbk', 'utf-8');
	if ($suffix)
		return $restr . "…";
	return $restr;
}

/**
  +----------------------------------------------------------
 * 字符串截取，支持中文和其他编码 双字节截取模式
  +----------------------------------------------------------
 * @param string $str 需要转换的字符串
 * @param string $length 截取长度
 * @param string $start 开始位置
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
  +----------------------------------------------------------
 */
function msubstr($str, $length, $start=0, $charset="utf-8", $suffix=true) {
	if (function_exists("mb_substr"))
		return mb_substr($str, $start, $length, $charset);
	elseif (function_exists('iconv_substr')) {
		return iconv_substr($str, $start, $length, $charset);
	}
	$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
	$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
	$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
	$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
	preg_match_all($re[$charset], $str, $match);
	$slice = join("", array_slice($match[0], $start, $length));
	if ($suffix)
		return $slice . "…";
	return $slice;
}

// 自动转换字符集 支持数组转换
function auto_charset($fContents, $from, $to) {
	$from = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;
	$to = strtoupper($to) == 'UTF8' ? 'utf-8' : $to;
	if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {
		//如果编码相同或者非字符串标量则不转换
		return $fContents;
	}
	if (is_string($fContents)) {
		if (function_exists('mb_convert_encoding')) {
			return mb_convert_encoding($fContents, $to, $from);
		} elseif (function_exists('iconv')) {
			return iconv($from, $to, $fContents);
		} else {
			return $fContents;
		}
	} elseif (is_array($fContents)) {
		foreach ($fContents as $key => $val) {
			$_key = auto_charset($key, $from, $to);
			$fContents[$_key] = auto_charset($val, $from, $to);
			if ($key != $_key)
				unset($fContents[$key]);
		}
		return $fContents;
	}
	else {
		return $fContents;
	}
}

/**
  +----------------------------------------------------------
 * 可逆加密
  +----------------------------------------------------------
 * @param string $string 待加密或解密的字符串
 * @param string $operation DECODE：加密  ENCODE：解密
 * @param string $key 密钥  需要对应的密钥才能解密
 * @param int $expiry 时间  加密字符过期时间
 * @param int $ckey_length 加密强度*16次方 0为1个原文对应1个加密串 大于0为多个加密串 增加破解难度
  +----------------------------------------------------------
 */
function fmd5($string, $operation = 'DECODE', $key = '', $expiry = 0, $ckey_length=4) {

	if ($operation == 'DECODE') {
		//特殊字符替换
		$string = str_ireplace(array('A4vQo', 'BpUYe', 'NbM8i'), array('+', '/', '='), $string);
	}

	$key = md5($key ? $key : C('DEFAULT_KEY'));
	$keya = md5(substr($key, 0, 16));
	$keyb = md5(substr($key, 16, 16));
	$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';

	$cryptkey = $keya . md5($keya . $keyc);
	$key_length = strlen($cryptkey);

	$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
	$string_length = strlen($string);

	$result = '';
	$box = range(0, 255);

	$rndkey = array();
	for ($i = 0; $i <= 255; $i++) {
		$rndkey[$i] = ord($cryptkey[$i % $key_length]);
	}

	for ($j = $i = 0; $i < 256; $i++) {
		$j = ($j + $box[$i] + $rndkey[$i]) % 256;
		$tmp = $box[$i];
		$box[$i] = $box[$j];
		$box[$j] = $tmp;
	}

	for ($a = $j = $i = 0; $i < $string_length; $i++) {
		$a = ($a + 1) % 256;
		$j = ($j + $box[$a]) % 256;
		$tmp = $box[$a];
		$box[$a] = $box[$j];
		$box[$j] = $tmp;
		$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
	}

	if ($operation == 'DECODE') {
		if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
			return substr($result, 26);
		} else {
			return '';
		}
	} else {
		$tmp = $keyc . str_replace('=', '', base64_encode($result));
		//特殊字符替换
		$tmp = str_ireplace(array('+', '/', '='), array('A4vQ', 'BpUY', 'Nb8i'), $tmp);
		return $tmp;
	}
}

// 批量过滤html $post待过滤的数组 $tag不需要过滤的字段  $type递归函数传参 0=HTML转文本 1=只过滤危险HTML
function htmls($post, $tag, $type=0) {
	is_string($tag) && $tag = explode('|', $tag);
	if (is_string($post)) {
		return ($type == 0) ? html2text($post) : html($post);
	}
	foreach ($post as $k => $v) {
		$t = in_array($k, $tag) ? 1 : 0;
		$post[$k] = htmls($v, $tag, $t);
	}
	return $post;
}

// 过滤危险html代码
function html($str) {
	$farr = array(
		"/\s+/", //过滤多余的空白
		"/<(\/?)(script|i?frame|style|html|body|title|head|link|meta|\?|\%)([^>]*?)>/isU", //过滤 <script 等可能引入恶意内容或恶意改变显示布局的代码,如果不需要插入flash等,还可以加入<object的过滤
		"/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU", //过滤javascript的on事件
	);
	$tarr = array(
		" ",
		"", //"＜\\1\\2\\3＞" 如果要直接清除不安全的标签，这里可以留空
		"\\1\\2",
	);
	$str = preg_replace($farr, $tarr, $str);
	return $str;
}

// html转纯文本
function html2text($str) {
	$str = trim($str);
	$str = preg_replace("/<sty(.*)\\/style>|<scr(.*)\\/script>|<!--(.*)-->/isU", "", $str);
	$alltext = "";
	$start = 1;
	for ($i = 0; $i < strlen($str); $i++) {
		if ($start == 0 && $str[$i] == ">") {
			$start = 1;
		} else if ($start == 1) {
			if ($str[$i] == "<") {
				$start = 0;
				$alltext .= "";
			} else if (ord($str[$i]) > 31) {
				$alltext .= $str[$i];
			}
		}
	}
	$alltext = str_replace("　", " ", $alltext);
	$alltext = preg_replace("/&([^;&]*)(;|&)/", "", $alltext);
	$alltext = preg_replace("/[ ]+/s", " ", $alltext);
	$alltext = htmlspecialchars($alltext, ENT_QUOTES);
	return $alltext;
}

/**
  +----------------------------------------------------------
 * 字符串命名风格转换
 * type
 * =0 将Java风格转换为C的风格
 * =1 将C风格转换为Java的风格
  +----------------------------------------------------------
 * @access protected
  +----------------------------------------------------------
 * @param string $name 字符串
 * @param integer $type 转换类型
  +----------------------------------------------------------
 * @return string
  +----------------------------------------------------------
 */
function parse_name($name, $type=0) {
	if ($type) {
		return ucfirst(preg_replace("/_([a-zA-Z])/e", "strtoupper('\\1')", $name));
	} else {
		$name = preg_replace("/[A-Z]/", "_\\0", $name);
		return strtolower(trim($name, "_"));
	}
}

?>